﻿using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System;
using System.Collections.Generic;
using System.Text;

namespace Miao.SourceGen.Learn
{
    //public class MiaoIncrementalGenerator: ISourceGenerator
    //{
    //    //告诉框架层需要关注哪些文件的变更
    //    //在有对应的文件的变更情况下，才会触发后续步骤。如此就是增量代码生成的关键
    //    //告诉框架层从变更的文件里面感兴趣什么数据，对数据预先进行处理
    //    //预先处理过程中，是会不断进行丢掉处理的
    //    //其中第一步和第二步可以合在一起
    //    //使用给出的数据进行处理源代码生成逻辑
    //    //这一步的逻辑和普通的 Source Generator 是相同的，只是输入的参数不同

    //    public void Initialize(IncrementalGeneratorInitializationContext context)
    //    {
    //        //Debugger.Launch();//牛逼，加这个代码效果把断点打进去了，原生的Unity再编译。////


    //        //注意文件
    //        var candidateProvider = context.SyntaxProvider.CreateSyntaxProvider(
    //            predicate: MiaoSyntaxFinder.IsSyntaxTargetForGeneration,
    //            transform: MiaoSyntaxFinder.GetSemanticTargetForGeneration
    //            ).Where(t => t is { });//Where将空部分剔除


    //        context.RegisterSourceOutput(candidateProvider, Generate);

    //        // IncrementalValueProvider<Compilation> compilations =
    //        //context.CompilationProvider
    //        //    // 这里的 Select 是仿照 Linq 写的，可不是真的 Linq 哦，只是一个叫 Select 的方法
    //        //    // public static IncrementalValueProvider<TResult> Select<TSource,TResult>(this IncrementalValueProvider<TSource> source, Func<TSource,CancellationToken,TResult> selector)
    //        //    .Select((compilation, cancellationToken) => compilation);





    //        //这里第一个参数是判断文件是否是业务逻辑感兴趣的，过滤是否是感兴趣的
    //        //第二个参数就是转换处理逻辑，要求返回值是处理完成返回的任意类型
    //        //predicate = 一个函数，用于确定是否应转换给定的<see cref=“SyntaxNode”
    //        //<param name=“transform”>当<paramref name=“predice”/>为给定节点返回<c>true</c>时执行转换的函数

    //        //var candidateProvider =  context.SyntaxProvider.CreateSyntaxProvider(
    //        //    predicate: MySyntaxFinder.IsSyntaxTargetForGeneration,
    //        //    transform);
    //    }

    //    public static void Generate(SourceProductionContext context, ClassDeclarationSyntax classDeclarationSyntax)
    //    {
    //        //Debugger.Launch();
    //        SyntaxTree syntaxTree = classDeclarationSyntax.SyntaxTree;
    //        string outputSource = MyGenerate.Generate();


    //        string savePath = SourceOutputHelpers.GetGeneratedSourceFileName(syntaxTree);



    //        //context.AddSource(savePath, outputSource);
    //        //SourceOutputHelpers.OutputSourceToFile(savePath, outputSource);
    //    }

    //}
}
